﻿<%@ Page Language="VB" %>
<% @Import Namespace="System.Data" %>
<% @Import Namespace="System.Data.SqlClient" %>
<%  Session.LCID = 1040%>        
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    
    Const SEPARATOR As String = "^-^"
    
    Public ForcedAccount As Boolean
    
    ' true se autenticato , false se no
    ' in Msg il messaggio da restiruire al client 
    ' in PersonsId restituisce il codice dell'utente
    Public Function CheckLogin(ByRef Msg As String, ByRef PersonsId As Integer) As Boolean
            
        ' utilizzo di datareader            
        Dim query As String
        Dim conn As SqlConnection
        Dim command As SqlCommand
        Dim reader As SqlDataReader
                
        conn = New SqlConnection(ConfigurationManager.ConnectionStrings("MSSql12155ConnectionString").ConnectionString)

        ' se valore nullo esci
        If Request("userid") = Nothing Then
            Msg = "User o password non riconosciuti"
            Return False
        End If
        
        query = "SELECT Persons_Id, active, ForcedAccount FROM MSSql12155.Persons WHERE [userId]='" & Request("userid") & "' AND [password]='" & Request("password") & "'"
        command = New SqlCommand(query, conn)
        conn.Open()
    
        reader = command.ExecuteReader()

        If reader.HasRows Then
            ' utente esistente
            reader.Read()            
            ForcedAccount = reader.GetBoolean(2)

            ' utente deve avere limitazione su progetti 
            If ForcedAccount = False Then
                Msg = "Utente non valido, mancano limitazioni su progetti"
                Return False
            End If
            
            ' colonna 9 contiene il flag di attivo
            If reader.GetBoolean(1) Then
                ' utente è attivo, salva in variabile globale lo stato di forzato
                PersonsId = reader.GetInt32(0)
                Return True
            Else
                Msg = "Utente non attivo"
                Return False
            End If
            
        Else
            Msg = "User o password non riconosciuti"
            ' utente non autenticato
            Return False
        End If
        
        conn.Close()
        
    
    End Function

    ' Riceve in input id utente, progetto e spesa
    ' Verifica che l'utente sia abilitato per il progetto e la spesa che si vuole aggiornare
    ' true se autenticato , false se no
    ' in Msg il messaggio da restiruire al client 
    Public Function CheckForcedAccount(ByVal PersonsId As Integer, ByVal ProjectId As Integer, _
                                       ByVal ExpenseTypeId As Integer, ByRef Msg As String) As Boolean
    
        ' utilizzo di datareader            
        Dim query As String
        Dim conn As SqlConnection
        Dim command As SqlCommand
        Dim reader As SqlDataReader

        ' Se non ci sono vincoli su progetti o spese esce con esito positivo
         If ForcedAccount = False Then
            Return True
        End If
            
        conn = New SqlConnection(ConfigurationManager.ConnectionStrings("MSSql12155ConnectionString").ConnectionString)
    
        ' ** verifica il progetto **
        
        query = "SELECT * FROM MSSql12155.ForcedAccounts WHERE [Projects_id]='" & ProjectId & "' AND [Persons_id]='" & PersonsId & "'"
        command = New SqlCommand(query, conn)
        conn.Open()
        reader = command.ExecuteReader()

        If Not reader.HasRows Then
            Msg = "Progetto non abilitato per l'utente"
            Return False
        End If
        
        reader.Close()
        
        ' ** adesso verifica le spese **
        
        query = "SELECT * FROM MSSql12155.ForcedExpensesPers WHERE [ExpenseType_id]='" & ExpenseTypeId & "' AND [Persons_id]='" & PersonsId & "'"
        command = New SqlCommand(query, conn)   
        reader = command.ExecuteReader()

        If reader.HasRows Then
            ' codice progetto è ammesso
            Return True
        Else
            Msg = "Tipo spesa non abilitata per l'utente"
            Return False
        End If
                
        conn.Close()
                     
    End Function

    ' verifica che la data di aggiornameto sia ammessa
    Public Function CheckCutoff(ByVal UpdDate As String, ByRef Msg As String) As Boolean
            
        ' utilizzo di datareader            
        Dim query As String
        Dim conn As SqlConnection
        Dim command As SqlCommand
        Dim reader As SqlDataReader
                
        conn = New SqlConnection(ConfigurationManager.ConnectionStrings("MSSql12155ConnectionString").ConnectionString)
    
        query = "SELECT * FROM MSSql12155.Options"
        command = New SqlCommand(query, conn)
        conn.Open()
    
        reader = command.ExecuteReader()

        If reader.HasRows Then
            ' utente esistente
            reader.Read()

            If DateTime.Parse(UpdDate.ToString) <= CutoffDate(reader("cutoffPeriod"), reader("cutoffMonth"), reader("cutoffYear"), "end") Then
                Msg = "Periodo chiuso, impossibile aggiornare"
                ' utente attivo
                Return False
            Else
                Return True
            End If            
        Else
            Msg = "impossibile determinare periodo aggiornamento"
            ' utente non autenticato
            Return False
        End If
        
        conn.Close()    
    End Function    
    
    '----------------------------------------------------------------------------
    Function CutoffDate(ByVal strPeriod As String, ByVal strMonth As String, ByVal strYear As String, ByVal strType As String) As String
        '----------------------------------------------------------------------------
        '        Dim aDaysInMonth As Array
        
        Dim aDaysInMonth() As Integer = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

        '        strType can be "begin" or "end"
        '        begin:        the date returned is set and the first day of the period
        '        end:        the date returned is set and the last day of the period


        ' calc the cutoff date based on the input parameter
        If strPeriod = "1" Then
            If strType = "end" Then
                CutoffDate = CDate("15/" & strMonth & "/" & strYear)
            Else
                CutoffDate = CDate("1/" & strMonth & "/" & strYear)
            End If
        Else
            If strType = "end" Then
                CutoffDate = CDate(aDaysInMonth(strMonth - 1) & "/" & strMonth & "/" & strYear)
            Else
                CutoffDate = CDate("16" & "/" & strMonth & "/" & strYear)
            End If
        End If

    End Function
        
    ' Check sui parametri
    Public Function CheckParameters(ByVal PersonsId As Integer, _
                             ByVal ProjectId As String, _
                             ByVal ExpenseTypeId As String, _
                             ByVal UpdDate As String, _
                             ByVal Amount As String, _
                             ByRef Msg As String) As Boolean
    
        If PersonsId = Nothing Or _
           ProjectId = Nothing Or _
           ExpenseTypeId = Nothing Or _
           UpdDate = Nothing Or _
           Amount = Nothing Then
            Msg = "Parametri obbligatori non specificati"
            ' utente non autenticato
            Return False
        End If
        Return True
        
    End Function
    
    
    ' Effettua l'aggiornamento 
    ' Input: tutti i paramentri da aggiornare
    ' Output: messaggio con aggiornamento positivo o no
    Public Function DoUpdate(ByVal PersonsId As Integer, _
                             ByVal ProjectId As String, _
                             ByVal ExpenseTypeId As String, _
                             ByVal UpdDate As String, _
                             ByVal Amount As String, _
                             ByVal Comment As String, _
                             ByVal CreditCardPayed As String, _
                             ByVal InvoiceFlag As String, _
                             ByRef Msg As String) As Boolean
        
        ' utilizzo di datareader            
        Dim sql_insert As String
        Dim conn As SqlConnection
        Dim command As SqlCommand

        conn = New SqlConnection(ConfigurationManager.ConnectionStrings("MSSql12155ConnectionString").ConnectionString)
        
        sql_insert = "insert into MSSql12155.Expenses (Projects_id, Persons_id, ExpenseType_id, date, amount,Comment, CreditCardPayed, InvoiceFlag) values " & _
         "(" & ASPcompatility.FormatStringDb(ProjectId) & ", " & _
                ASPcompatility.FormatStringDb(PersonsId) & ", " & _
                ASPcompatility.FormatStringDb(ExpenseTypeId) & ", " & _
                ASPcompatility.FormatDateDb(UpdDate) & ", " & _
                ASPcompatility.FormatStringDb(Amount) & ", " & _
                ASPcompatility.FormatStringDb(Comment) & ", " & _
                ASPcompatility.FormatStringDb(CreditCardPayed) & ", " & _
                ASPcompatility.FormatStringDb(InvoiceFlag) & ")"
        
        ' 1. Instantiate a new command with a query and connection
        command = New SqlCommand(sql_insert, conn)
        conn.Open()
        
        ' Call ExecuteNonQuery to send command
        command.ExecuteNonQuery()

        ' Done. Now Close the connection
        conn.Close()
        conn = Nothing
         
        Return True
        
    
    End Function
     
    ' verifica che la data di aggiornameto sia ammessa
    Public Function SendInfo(ByRef Msg As String, ByVal PersonsId As Int16) As Boolean
            
        ' utilizzo di datareader            
        Dim query As String
        Dim conn As SqlConnection
        Dim command As SqlCommand
        Dim reader As SqlDataReader
                
        conn = New SqlConnection(ConfigurationManager.ConnectionStrings("MSSql12155ConnectionString").ConnectionString)
        conn.Open()
    
        ' seleziona tutti i conti postabili con quella account
        query = "SELECT fa.Projects_id, pr.ProjectCode, pr.name FROM MSSql12155.ForcedAccounts as fa" & _
        " inner join MSSql12155.Projects as pr ON pr.projects_id = fa.projects_id where fa.Persons_id = " & ASPcompatility.FormatStringDb(PersonsId)
       
        command = New SqlCommand(query, conn)
        reader = command.ExecuteReader()
        
        Msg = ""
        
        ' formato stringa:
        ' "P" + "::" + id progetto + "::" + codice commessa + "::" + descrizione progetto
        ' la stringa ^-^ è il iseparatore da progetto a progetto       
        While reader.Read()           
            Msg = Msg + "P" + "::" + reader("Projects_id").ToString + "::" + reader("ProjectCode").ToString  + "::" + reader("name").ToString + SEPARATOR
        End While
        
        ' elimina l'ultimo separatore
        Msg = Msg.Substring(0, Msg.Length - 3)        
        reader.Close()

        ' seleziona tutti i conti postabili con quella account
        query = "SELECT * FROM MSSql12155.ForcedExpensesPers where Persons_id = " & ASPcompatility.FormatStringDb(PersonsId)
        command = New SqlCommand(query, conn)
        reader = command.ExecuteReader()

        While reader.Read()
            Msg = Msg + reader("ExpenseType_id").ToString + SEPARATOR
        End While
        
        ' elimina l'ultimo separatore
        Msg = Msg.Substring(0, Msg.Length - 3)
        
        reader.Close()    
        conn.Close()
    
    End Function
    
    ' *************************************
    ' *  PAGE LOAD                        *
    ' *************************************
    '
    ' Sintassi di chiamata pagina:
    ' INPUT
    ' cmd = "info" : 
    ' cmd = "upd"  : effettua aggiornamento
    ' ProjectId ExpenseId Date Amount Comment                     
    ' OUTPUT
    ' WSReturn = testo con esito servizio
    ' WSRC = return code, 0 esito positivo, 999 errore
    '
    
    Public Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        Dim Msg As String = ""
        Dim PersonsId As Integer
              
        If CheckLogin(Msg, PersonsId) = False Then
            ' setta messaggio e RC
            WSreturn.Text = Msg
            WSRC.Text = "999"
            Exit Sub
        End If
            
        Select Case Request("cmd")
            
            Case "info"
                ' in inpunt codice persona, in output elenco progetti e tipo spese possibili
                If SendInfo(Msg, PersonsId) = False Then
                    ' setta messaggio e RC
                    WSreturn.Text = Msg
                    WSRC.Text = "999"                    
                Else
                    ' restituisce elenco
                    WSreturn.Text = Msg
                    WSRC.Text = "0"
                End If                
                
            Case "display"
                
            Case "upd"
                
                    ' utente autenticato, verifica che disponga delle autorizzazioni per
                    ' effettuare l'aggiornamento
                    If CheckParameters(Request("PersonId"), Request("ProjectId"), Request("ExpenseTypeId"), Request("Date"), Request("Amount"), Msg) = False Then
                        ' setta messaggio e RC
                        WSreturn.Text = Msg
                        WSRC.Text = "999"
                        Exit Sub
                    End If
                
                    ' utente autenticato, verifica che disponga delle autorizzazioni per
                    ' effettuare l'aggiornamento
                    If CheckForcedAccount(PersonsId, Request("ProjectId"), Request("ExpenseTypeId"), Msg) = False Then
                        ' setta messaggio e RC
                        WSreturn.Text = Msg
                        WSRC.Text = "999"
                        Exit Sub
                    End If

                    ' Verifica che la data di aggiornaemento sia ammessa
                    If CheckCutoff(Request("Date"), Msg) = False Then
                        ' setta messaggio e RC
                        WSreturn.Text = Msg
                        WSRC.Text = "999"
                        Exit Sub
                    End If
                
                    ' Verifica che la data di aggiornaemento sia ammessa
                    If DoUpdate(PersonsId, _
                                Request("ProjectId"), _
                                Request("ExpenseTypeId"), _
                                Request("Date"), _
                                Request("Amount"), _
                                Request("Comment"), _
                                Request("CreditCardPayed"), _
                                Request("InvoiceFlag"), _
                                Msg) = False Then

                        ' setta messaggio e RC
                        WSreturn.Text = "aggiornamento in errore"
                        WSRC.Text = "999"
                    Else
                        WSreturn.Text = "aggiornamento effettuato"
                        WSRC.Text = "0"
                    End If
                  
            Case Else
                    ' setta messaggio e RC
                    WSreturn.Text = "Nessun comando selezionato"
                    WSRC.Text = "999"
                    Exit Sub
                
        End Select
                        
    
    End Sub
        
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>

<div>MSG:<asp:label id="WSreturn" runat="server" /></div>
<div>RC:<asp:label id="WSRC" runat="server" /></div>

</body>
</html>
